package org.langqiao.algorithm;
/*
 * 某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某1笔或几笔。如果已知明细账目清单，能通过编程找到漏掉的是哪1笔或几笔吗？
如果有多种可能，则输出所有可能的情况。
我们规定：用户输入的第一行是：有错的总金额。
接下来是一个整数n，表示下面将要输入的明细账目的条数。
再接下来是n行整数，分别表示每笔账目的金额。
要求程序输出：所有可能漏掉的金额组合。每个情况1行。金额按照从小到大排列，中间用空格分开。
比如：
用户输入：
6
5
3
2
4
3
1
表明：有错的总金额是6；明细共有5笔。
此时，程序应该输出：
1 3 3
2 5
3 4
为了方便，不妨假设所有的金额都是整数；每笔金额不超过1000，金额的明细条数不超过100。
 */
import java.util.Scanner;
public class AmountError {
	
	public static void main(String[] args) {
		
		System.out.println("请输入出错的总金额：");
		Scanner sc = new Scanner(System.in);
		int amount = sc.nextInt();
		int i=0,n=0,sum=0;
		do {
			System.out.println("请输入明细条目的总数：");//控制金额的明细条数不超过100
			n=sc.nextInt();
		}while(n>=100);
		
		int[] money = new int[n+1];
		do {
			System.out.println("请输入每笔金额的数目：");//控制每笔账目的输出，一行输入一个，且金额数组都不大于1000
			for(i=0;i<n;i++) {
			   money[i]=sc.nextInt();
			   sum=sum+money[i];//
			}
//			System.out.println("原来金额的总数为："+sum);
		}while(money[i]>=1000);
		
		//减少的金额
		int reduce = sum-n;
		//接下来找所有金额差值等于reduce的组合
		System.out.println("减少的金额为："+reduce);
		int[] j = new int[100];
		int sum1 = 0;
		for(i = 0;i < n;i++) {
			for(j[i] = 0;j[i] < money[i];) {
			    sum1 = j[i];
			}
			sum1 = sum1+j[i];
		}
		if(sum1 == reduce) {
			System.out.print(sum1+"\t");
		}
		System.out.println();//输出一行数据后就换行
	}
}
